package listnode;

public class _92_反转链表_2 {

    /**
     * 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
     *
     * 说明:
     * 1 ≤ m ≤ n ≤ 链表长度。
     *
     * 示例:
     *
     * 输入: 1->2->3->4->5->NULL, m = 2, n = 4
     * 输出: 1->4->3->2->5->NULL
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/reverse-linked-list-ii
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     * @param head
     * @param m
     * @param n
     * @return
     */
    public static ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode pre = new ListNode();
        pre.next = head;
        int count = 1;
        ListNode node = pre;
        while (count!=m){
            node = node.next;
            count++;
        }
        node.next = reverse(node.next, n-m+1);
        return pre.next;
    }

    private static ListNode reverse(ListNode head, int i) {
        if (head == null || head.next ==null) {
            return head;
        }
        ListNode pre = null;
        ListNode cur = head;
        for (int i1 = 0; i1 < i; i1++) {
            ListNode tmp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = tmp;
        }
        head.next = cur;
        return pre;
    }
    public static void main(String[] args) {
        ListNode n1 = new ListNode(3);
        ListNode n2 = new ListNode(5);
//        ListNode n3 = new ListNode(3);
//        ListNode n4 = new ListNode(4);
//        ListNode n5 = new ListNode(5);
        n1.next = n2;
//        n2.next = n3;
//        n3.next = n4;
//        n4.next = n5;
        ListNode node = reverseBetween(n1, 1, 2);
    }
}
